package com.lin.carbon.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis 工具类，用于操作 Redis 黑名单，包括将 Token 添加到黑名单和检查 Token 是否在黑名单中
 */
@Component
public class RedisUtils {

    // 注入 RedisTemplate，用于操作 Redis 数据库
    @Autowired(required = true)
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 将 JWT Token 添加到 Redis 黑名单，并设置过期时间
     * @param token 要添加到黑名单的 JWT Token
     * @param expirationTime Token 的过期时间（毫秒）
     */
    public void addToBlacklist(String token, long expirationTime) {
        // 获取当前系统时间（毫秒）
        long currentTime = System.currentTimeMillis();
        // 计算 Token 剩余的有效时间
        long remainingTime = expirationTime - currentTime;
        if (remainingTime > 0) {
            // 使用 Redis 的 set 方法将 Token 添加到黑名单
            // 键为 "jwt:blacklist:" 加上 Token 字符串
            // 值为 "true" 表示该 Token 在黑名单中
            // remainingTime 为剩余有效时间，TimeUnit.MILLISECONDS 表示时间单位为毫秒
            redisTemplate.opsForValue().set("jwt:blacklist:" + token, "true", remainingTime, TimeUnit.MILLISECONDS);
        }
    }

    /**
     * 检查 JWT Token 是否在 Redis 黑名单中
     * @param token 要检查的 JWT Token
     * @return 如果 Token 在黑名单中返回 true，否则返回 false
     */
    public boolean isBlacklisted(String token) {
        // 从 Redis 中获取指定键对应的值
        // 如果存在且值为 "true"，则表示该 Token 在黑名单中
        String value = (String) redisTemplate.opsForValue().get("jwt:blacklist:" + token);
        return Boolean.parseBoolean(value);
    }
}
